# -*- coding: utf-8 -*-
from ftplib import FTP
from utils import dayUtils,chineseNameUtil


# 连接ftp
def ftp_connect(host, port, username, password):
    ftp = FTP()
    # 打开调试级别2，显示详细信息
    # ftp.set_debuglevel(2)
    ftp.connect(host, port)
    ftp.login(username, password)
    return ftp


# 从ftp下载文件
def download_file(ftp_instance, remote_path, local_path):
    # 设置的缓冲区大小
    buff_size = 1024
    fp = open(local_path, 'wb')
    ftp_instance.retrbinary('RETR ' + remote_path, fp.write, buff_size)
    ftp_instance.set_debuglevel(0)  # 参数为0，关闭调试模式
    fp.close()


# 从本地上传文件到ftp
def upload_file(ftp, remote_path, local_path):
    buff_size = 1024
    fp = open(local_path, 'rb')
    ftp.storbinary('STOR ' + remote_path, fp, buff_size)
    ftp.set_debuglevel(0)
    fp.close()


if __name__ == "__main__":
    host = ""
    port = 21
    username = ""
    password = ""
    file_name = ""
    image_bed_path = "image/media/image_bed"
    # 处理文件中文问题
    if chineseNameUtil.is_chinese(file_name):
        new_file_name = chineseNameUtil.rename(file_name)
    else:
        new_file_name = file_name
    # 目录名
    dir_name = dayUtils.get_year() + dayUtils.get_month() + dayUtils.get_day()
    # 路径名 ftp客户端不支持多级目录
    ftp_path = "./{}/".format(dir_name)
    # print(ftp_path)
    # host,port, username, password
    ftp = ftp_connect(host, port, username, password)
    # 下载文件，第一个是ftp服务器路径下的文件，第二个是要下载到本地的路径文件
    # download_file(ftp, "/12.mp3", r"C:\Users\Administrator\Desktop\ftp\download\test.mp3")
    # 上传文件，第一个是要上传到ftp服务器路径下的文件，第二个是本地要上传的的路径文件
    ftp.cwd('image_bed')
    if dir_name not in ftp.nlst():
        ftp.mkd(ftp_path)
    upload_file(ftp, ftp_path + new_file_name, file_name)
    # ftp.close() #关闭ftp
    # #调用本地播放器播放下载的视频
    # os.system('start D:\soft\kugou\KGMusic\KuGou.exe C:\Users\Administrator\Desktop\ftp\test.mp3')

    print(ftp.getwelcome())  # 打印出欢迎信息
    # 获取当前路径
    pwd_path = ftp.pwd()
    print("FTP当前路径:", pwd_path)
    # 显示目录下所有目录信息
    # ftp.dir()
    # 设置FTP当前操作的路径
    ftp.cwd(dir_name)
    # 返回一个文件名列表
    filename_list = ftp.nlst()
    if new_file_name in filename_list:
        print("图片已上传至：http://{}/{}/{}/{}".format(host, image_bed_path, dir_name, new_file_name))
    else:
        print("图片上传失败")
        print(filename_list)
    #
    # ftp.mkd('目录名')  # 新建远程目录
    # ftp.rmd('目录名')  # 删除远程目录
    # ftp.delete('文件名')  # 删除远程文件
    # ftp.rename('fromname', 'toname')  # 将fromname修改名称为toname

    # 逐行读取ftp文本文件
    # file = '/upload/1.txt'
    # ftp.retrlines('RETR %s' % file)
    # 与 retrlines()类似，只是这个指令处理二进制文件。回调函数 cb 用于处理每一块（块大小默认为 8KB）下载的数据
    # ftp.retrbinary('RETR %s' % file)

    # ftp登陆连接
    # from ftplib import FTP  # 加载ftp模块
    #
    # ftp = FTP()  # 设置变量
    # ftp.set_debuglevel(2)  # 打开调试级别2，显示详细信息
    # ftp.connect("IP", "port")  # 连接的ftp sever和端口
    # ftp.login("user", "password")  # 连接的用户名，密码
    # print
    # ftp.getwelcome()  # 打印出欢迎信息
    # ftp.cmd("xxx/xxx")  # 进入远程目录
    # bufsize = 1024  # 设置的缓冲区大小
    # filename = "filename.txt"  # 需要下载的文件
    # file_handle = open(filename, "wb").write  # 以写模式在本地打开文件
    # ftp.retrbinaly("RETR filename.txt", file_handle, bufsize)  # 接收服务器上文件并写入本地文件
    # ftp.set_debuglevel(0)  # 关闭调试模式
    # ftp.quit()  # 退出ftp
    #
    # ftp相关命令操作
    # ftp.cwd(pathname)  # 设置FTP当前操作的路径
    # ftp.dir()  # 显示目录下所有目录信息
    # ftp.nlst()  # 获取目录下的文件
    # ftp.mkd(pathname)  # 新建远程目录
    # ftp.pwd()  # 返回当前所在位置
    # ftp.rmd(dirname)  # 删除远程目录
    # ftp.delete(filename)  # 删除远程文件
    # ftp.rename(fromname, toname)  # 将fromname修改名称为toname。
    # ftp.storbinaly("STOR filename.txt", file_handel, bufsize)  # 上传目标文件
    # ftp.retrbinary("RETR filename.txt", file_handel, bufsize)  # 下载FTP文件